package practise;

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Objects;

public class LeetCode_practise1 {
    public static void main(String[] args) {
//    ArrayList<Integer> array1 = new ArrayList<Integer>();
//    array1.add(2);
//    array1.add(4);
//    array1.add(3);
//        ArrayList<Integer> array2= new ArrayList<Integer>();
//        array2.add(5);
//        array2.add(6);
//        array2.add(4);
//        System.out.println(LeetCode_practise1.addTwoNumbers(array1,array2).toString());;
//        ListNode l1 = new ListNode(3);
        ListNode l2 = new ListNode(4); // 24 + 564
        ListNode l3 = new ListNode(2, l2);
//        ListNode l4 = new ListNode(9);
//        ListNode l5 = new ListNode(9, l4);
//        ListNode l6 = new ListNode(9, l5);
//        ListNode l7 = new ListNode(9, l6);
//        ListNode l8 = new ListNode(9, l7);
//        ListNode l9 = new ListNode(9, l8);
//        ListNode l10 = new ListNode(9, l9);
        ListNode l11 = new ListNode(4);
        ListNode l12 = new ListNode(6, l11);
        ListNode l13 = new ListNode(5, l12);
        ListNode listNode = LeetCode_practise1.addTwoNumbers(l3, l13);
//        System.out.println(listNode.val );

    }

    public static class ListNode {
        int val;
        ListNode next;

        ListNode() {
        }

        ListNode(int val) {
            this.val = val;
        }

        ListNode(int val, ListNode next) {
            this.val = val;
            this.next = next;
        }
    }
    /*public static ArrayList<Integer> addTwoNumbers(ArrayList<Integer> l1, ArrayList<Integer> l2) {
        int size1 = 0;
        int size2 = 0;
        int result = 0;
        ArrayList<Integer> resultArr = new ArrayList<>();
        for (int i = 0; i < (Math.max(l1.size(), l2.size())); i++) {
            if(i < l1.size())
          size1 += l1.get(i) * Math.pow(10,i);
            if(i < l2.size())
          size2 += l2.get(i)  * Math.pow(10,i);
            if (i == (Math.max(l1.size(), l2.size())) -1 ) {
                System.out.println(size1);
                System.out.println(size2);
                result = size1 +size2;
            }
        }
        System.out.println(result);
        for (int i = 0; i < String.valueOf(result).length(); i++) {
            resultArr.add(Integer.parseInt(String.valueOf(String.valueOf(result).charAt(i))));
        }
        return resultArr;
}*/

    public static ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        LinkedList<Integer> arrayList1 = new LinkedList<>();
        LinkedList<Integer> arrayList2 = new LinkedList<>();
        LinkedList<Integer> arrayList3 = new LinkedList<>();
        int index1 = 0;
        ListNode temp1 = l1;
        ListNode temp2 = l2;
        while (index1 == 0 || null != l1.next || String.valueOf(l1.val) != null) {
            index1++;
            arrayList1.add(l1.val);
            if (null != l1.next) {
                l1 = l1.next;
            } else {
                break;
            }
        }
        int index2 = 0;
        while (index2 == 0 || null != l2.next || String.valueOf(l2.val) != null) {
            index2++;
            arrayList2.add(l2.val);
            if (null != l2.next) {
                l2 = l2.next;
            } else {
                break;
            }
        }

        if (arrayList1.size() > arrayList2.size()) {
            int size = arrayList1.size() - arrayList2.size();
            for (int i = 0; i < size; i++) {
                arrayList2.add(0);
            }
        }

        if (arrayList1.size() < arrayList2.size()) {
            {
                int size = arrayList2.size() - arrayList1.size();
                for (int i = 0; i < size; i++) {
                    arrayList1.add(0);
                }
            }
        }

        int flag = 0;
            for (int i = 0; i < (Math.max(arrayList1.size(), arrayList2.size())) ; i++) {
               if (arrayList1.get(i) + arrayList2.get(i) + flag >= 10) {
                   arrayList3.add((arrayList1.get(i) + arrayList2.get(i) + flag)%10 );
                   System.out.println((arrayList1.get(i) + arrayList2.get(i) + flag)%10);
                   flag = 1;
               } else {

                       arrayList3.add(arrayList1.get(i) + arrayList2.get(i) +flag);
                   System.out.println(arrayList1.get(i) + arrayList2.get(i) +flag);
                       flag = 0;
                }
            }
            if (flag ==1) {
                arrayList3.add(flag);
                flag = 0;
            }
            ListNode listNode3 = null;
            for (int i = arrayList3.size()-1; i >= 0 ; i--) {
                if (i==arrayList3.size()-1) {
                    listNode3 = new ListNode(arrayList3.get(i));
                } else {
                    listNode3 = new ListNode( arrayList3.get(i),listNode3);
                }
            }

            System.out.println(arrayList1);
            System.out.println(arrayList2);
            System.out.println(arrayList3);

return listNode3;

    }
}
